/*
 * To change this template, choose Tools | Templates
 * and open the template in the editor.
 */
package terrforming.space.graphics;

import java.util.Iterator;
import javax.media.opengl.GL;
import javax.media.opengl.GL2;
import javax.media.opengl.GLAutoDrawable;
import javax.media.opengl.GLEventListener;
import terrforming.space.objects.CosmicDust;
import terrforming.space.objects.CosmicObject;
import terrforming.space.objects.Universe;

/**
 *
 * @author Cirreth
 */
public class OGLRenderer implements GLEventListener{
    
    //Параметры сдвига и масштабирования
    public float dx=0, dy=0, zoom=1;
    
    //OpenGL холст
    private GL2 gl;
    
    private Universe unvrs = Universe.getInstance();
    
    @Override
    //инициализация.
    public void init(GLAutoDrawable drawable) {
            gl=drawable.getGL().getGL2();
    }
    
    @Override
    //метод отображения
    public void display(GLAutoDrawable drawable) {
        render(drawable);
    }
    
    @Override
    //изменение размеров холста
    public void reshape(GLAutoDrawable drawable, int x, int y, int width, int height) {
    }
    
    @Override
    //метод скрытия формы
    public void dispose(GLAutoDrawable glad) {}
        
    //отрисовка (вызывается из display)
    public void render(GLAutoDrawable drawable){
            try {
                Thread.sleep(20);
            } catch (InterruptedException ex) {
                
            }
                //Пересчет состояния вселенной
                unvrs.getInstance().recalculate();
                //очистка буфера цвета
                gl.glClear(GL.GL_COLOR_BUFFER_BIT);
                //очистка буфера глубины
                gl.glClear(GL.GL_DEPTH_BUFFER_BIT);
                //подключение RGBA (прозрачности)
                gl.glEnable(GL.GL_BLEND);
                gl.glBlendFunc(GL.GL_SRC_ALPHA,GL.GL_ONE_MINUS_SRC_ALPHA);
                //заливка фона
                //сохрание матрицы 
                gl.glPushMatrix();
                //сдвиг изображения
                gl.glTranslated(dx, dy, 0);
                //масштабирование изображения
                gl.glScaled(zoom, zoom, 0);
                //рисуем пылинки
                gl.glBegin(GL.GL_POINTS);
                for (CosmicDust cdt : unvrs.getCd()) {
                    gl.glColor4d(.8+.2*Math.abs(cdt.getX()*cdt.getY()*100),.3+.7*Math.abs(cdt.getX()),.6+.4*Math.abs(cdt.getY()),.8f);
                    gl.glVertex2d(cdt.getX(), cdt.getY());
                }
                gl.glEnd();
                //
                for (CosmicObject cosmicObject : unvrs.getObjects()) {
                        cosmicObject.draw(gl);
                }
                //
                unvrs.getSglrt().draw(gl);
                //возврат матрицы
                gl.glPopMatrix();
                /*
                gl.glColor4f(1f, 1f, 1f, 1f);
                gl.glBegin(GL.GL_POINTS);
                //логика в отрисовке!
                for (Iterator i=Universe.getCd().iterator(); i.hasNext();) {
                     CosmicDust cd = (CosmicDust)i.next();
                     if (cd.isRemoved()) {
                         i.remove();
                     } else {
                         cd.next();
                         gl.glColor4d(.8+.2*Math.abs(sd.getX()*sd.getY()*100),.3+.7*Math.abs(sd.getX()),.6+.4*Math.abs(sd.getY()),.8f);
                         gl.glVertex2d(sd.getX(), sd.getY());
//                         gl.glColor4d(.8+.2*Math.abs(sd.getX()*sd.getY()*100),.3+.7*Math.abs(sd.getX()),.6+.4*Math.abs(sd.getY()),.4f);
//                         gl.glVertex2d(sd.getX()+0.001, sd.getY());
//                         gl.glVertex2d(sd.getX(), sd.getY()+0.001);
//                         gl.glVertex2d(sd.getX(), sd.getY()-0.001);
//                         gl.glVertex2d(sd.getX()-0.001, sd.getY());
//                         gl.glVertex2d(sd.getX()-.002*sd.getVx(), sd.getY()-.002*sd.getVy());
//                         gl.glVertex2d(sd.getX()-.005*sd.getVx(), sd.getY()-.005*sd.getVy());
                     }
                }
                gl.glEnd();
                for (Iterator i=objects.iterator(); i.hasNext();) {
                     Buildup buildup = (Buildup)i.next();
                     if (buildup.isRemoved()) {
                         i.remove();
                         continue;
                     } else {
                        buildup.next();
                        buildup.draw(gl);
                     }
                }
                */
            }
      
}